package com.ck.ips.service;

import com.ck.common.model.DeviceSetting;
import com.ck.common.model.DeviceStore;
import com.ck.common.model.OperationResult;
import com.ck.common.page.PageInfo;
import com.ck.core.constant.device.DeviceSettingType;
import com.ck.ips.model.vo.device.DeviceBasicInfoVO;
import com.ck.ips.model.vo.device.DeviceDetailVO;
import com.ck.ips.model.vo.device.DeviceGroupCountVO;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.util.List;

/**
* @Description: 设备 service
* @Author: hf
* @Date:    2019/4/29 9:53
* @Version: 1.0
*/
public interface DeviceService {

    /**
     * 查询一组设备序列号的分辨率集合（相同分辨率去重）
     * @param deviceCodes
     * @param deviceGroupIdList
     * @return
     */
    List<String> getDistinctResolvingPowerByDeviceCodes(List<String> deviceCodes, List<String> deviceGroupIdList);

    /**
     * 条件筛选获取设备基础信息
     * @param groupId  分组id
     * @param deviceName 终端名
     * @param deviceMac  mac地址
     * @param ip ip地址
     * @param deviceStatus 在线、离线状态
     * @param deviceSerialNum 终端序列号
     * @param deviceType 终端型号
     * @param resolvingPower 终端分辨率
     * @param bindingStatus 是否已经绑定
     * @param screenSize 屏幕尺寸
     * @param belowSoftVersion 软件版本（小于该版本的记录）
     * @param groupName 分组名称
     * @param storeName 门店名称
     * @param programDue 空刊状态（所有/空刊/非空刊）
     * @return
     */
    PageInfo<DeviceBasicInfoVO> listBasicDeviceInfoByPage(Integer pageNum, Integer pageSizeString
            , String groupId, String deviceName, String deviceMac, String ip, String deviceStatus
            , String deviceSerialNum, String deviceType, String resolvingPower, Integer bindingStatus
            , String screenSize, Integer belowSoftVersion, String groupName, String storeName, Boolean programDue, List<String> queryDeviceCodeList);


    /**
     * 获取设备详情
     * @param deviceCode
     * @return
     */
    DeviceDetailVO getDetailByDeviceCode(String deviceCode );

    /**
     * 根据节目版本号查询设备序列号
     * @param programVersionList 节目版本号集合
     * @return 设备序列号集合
     */
    List<String> listDeviceCodeByProgramVersion(List<String> programVersionList);

    /**
     * 刷新缓存
     * @param deviceSettingType 设备类型
     * @param codeList 设备序列号
     * @param serialNo 批次号
     */
    void flushDeviceStateCache(DeviceSettingType deviceSettingType, List<String> codeList, Long serialNo);

    /**
     * 将某个分组整体替换为另一个分组
     * @param deviceGroupId
     * @param anotherDeviceGroupId
     */
    void changeDeviceGroupToAnother(Long deviceGroupId, Long anotherDeviceGroupId);

    /**
     * 修改设备附属信息
     * @param deviceCode
     * @return
     */
    OperationResult updateDeviceDetail(DeviceStore deviceCode);

    /**
     * 终端设置信息同步到数据库
     *
     * @param setting     设置信息
     * @param deviceCodes 终端序列号集合
     */
    void updateDeviceSetting(DeviceSetting setting, List<String> deviceCodes);

    /**
     * 关机
     * @param deviceCodes
     * @return
     */
    OperationResult shutdown(String deviceCodes);

    /**
     * 重启
     * @param deviceCodes
     * @return
     */
    OperationResult restart(String deviceCodes);

    /**
     * 定时开关机
     * @param deviceCodes
     * @return
     */
    OperationResult setTimerShutDownOrStart(String deviceCodes,String bootTime,String offTime
            ,String nonWorkDayBootTime,String nonWorkDayOffTime);

    /**
     * wifi探针开关
     * @param deviceCodes
     * @return
     */
    OperationResult wifiProbeSwitch(String deviceCodes,Integer status);

    /**
     * 人脸识别开关
     * @param deviceCodes
     * @return
     */
    OperationResult faceRecognitionSwitch(String deviceCodes,Integer status);

    /**
     * 开关屏
     * @param deviceCodes
     * @return
     */
    OperationResult setScreenTimerShutDownOrStart(String deviceCodes,String bootTime,
                                                   String offTime);

    /**
     * 音量
     * @param deviceCodes
     * @return
     */
    OperationResult setVolume(String deviceCodes,Integer vol);

    /**
     * 解绑
     * @param deviceCodes
     * @return
     */
    Object untie(String deviceCodes);

    List<String> getDistinctTypeByDeviceCodes(List<String> deviceCodeList);

    /**
     * 获取终端分组下的拥有设备数量
     * @return
     */
    List<DeviceGroupCountVO> getDeviceCountByDeviceGroup();

    /**
     * 导出设备excel
     * @param groupId  分组id
     * @param deviceName 终端名
     * @param deviceMac  mac地址
     * @param ip ip地址
     * @param deviceStatus 在线、离线状态
     * @param deviceSerialNum 终端序列号
     * @param deviceType 终端型号
     * @param resolvingPower 终端分辨率
     * @param bindingStatus 是否已经绑定
     * @param screenSize 屏幕尺寸
     * @param belowSoftVersion 软件版本（小于该版本的记录）
     * @param groupName 分组名称
     * @param storeName 门店名称
     * @return
     */
    XSSFWorkbook exportDeviceExcel(Integer pageNum, Integer pageSize, String groupId, String deviceName, String deviceMac, String ip, String deviceStatus, String deviceSerialNum, String deviceType, String resolvingPower, Integer bindingStatus, String screenSize, Integer belowSoftVersion, String groupName, String storeName, Boolean deviceNoProgramCountdown);

    /**
     * 查询今日新增终端序列号
     * @return
     */
    List<String> listTodayNewDeviceCode();

    /**
     * 导出设备节目列表excel
     *
     * @param groupId          分组id
     * @param deviceName       终端名
     * @param deviceMac        mac地址
     * @param ip               ip地址
     * @param deviceStatus     在线、离线状态
     * @param deviceSerialNum  终端序列号
     * @param deviceType       终端型号
     * @param resolvingPower   终端分辨率
     * @param bindingStatus    是否已经绑定
     * @param screenSize       屏幕尺寸
     * @param belowSoftVersion 软件版本（小于该版本的记录）
     * @param groupName        分组名称
     * @param storeName        门店名称
     * @return
     */
    XSSFWorkbook exportDeviceProgramListExcel(Integer pageNum, Integer pageSize, String groupId, String deviceName, String deviceMac, String ip, String deviceStatus, String deviceSerialNum, String deviceType, String resolvingPower, Integer bindingStatus, String screenSize, Integer belowSoftVersion, String groupName, String storeName, Boolean programDue, Long startTime, Long endTime);

}
